class RequestManager {
  private idMap: any;

  constructor() {
    this.idMap = new Map();
  }
  /**
   * 生成唯一ID，并将ID和请求信息存储到map对象中
   * @param {string} method - 请求方法
   * @param {string} url - 请求URL
   * @param {object} params - 请求参数
   * @returns {string|boolean} - 生成的唯一ID，如果存在相同请求则返回false
   */
  generateId(method: string, url: string, params: any) {
    const id = this.generateUniqueId(method, url, params);
    if (this.idMap.has(id)) {
      return false;
    }
    this.idMap.set(id, { method, url, params });
    return id;
  }

  /**
   * 根据ID删除map对象中的请求信息
   * @param {string} id - 要删除的唯一ID
   */
  deleteById(id: string) {
    this.idMap.delete(id);
  }

  /**
   * 生成唯一ID的方法
   * @param {string} method - 请求方法
   * @param {string} url - 请求URL
   * @param {object} params - 请求参数
   * @returns {string} - 生成的唯一ID
   */
  generateUniqueId(method: string, url: string, params: any) {
    const idString = `${method}-${url}-${this.serializeObject(params)}`;
    let id = 0;
    for (let i = 0; i < idString.length; i++) {
      id = (id << 5) - id + idString.charCodeAt(i);
      id |= 0;
    }
    return id.toString();
  }

  /**
   * 序列化对象为字符串
   * @param {object} obj - 要序列化的对象
   * @returns {string} - 序列化后的字符串
   */
  serializeObject(obj: any) {
    const keys = Object.keys(obj).sort();
    const serializedObj: any = {};
    for (const key of keys) {
      const value = obj[key];
      if (value !== null && typeof value === 'object') {
        serializedObj[key] = this.serializeObject(value);
      } else {
        serializedObj[key] = value;
      }
    }
    return JSON.stringify(serializedObj);
  }
}

export default RequestManager;
